yield
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.
Der yield
-Operator wird verwendet, um die Ausführung einer Generator-Funktion anzuhalten und fortzusetzen.
Probieren Sie es aus
function* foo(index) {
while (index < 2) {
yield index;
index++;
}
}
const iterator = foo(0);
console.log(iterator.next().value);
// Expected output: 0
console.log(iterator.next().value);
// Expected output: 1
Syntax
yield
yield expression
Parameter
expression
Optional-
Der Wert, der aus der Generator-Funktion über das Iterator-Protokoll geliefert werden soll. Wird er weggelassen, wird
undefined
zurückgegeben.
Rückgabewert
Gibt den optionalen Wert zurück, der an die next()
-Methode des Generators übergeben wird, um ihre Ausführung fortzusetzen.
Hinweis:
Dies bedeutet, dass next()
asymmetrisch ist: es sendet immer einen Wert an das aktuell angehaltene yield
, gibt aber den Operand des nächsten yield
zurück. Das Argument, das an den ersten next()
-Aufruf übergeben wird, kann nicht abgerufen werden, da kein aktuell angehaltenes yield
vorhanden ist.
Beschreibung
Das yield
-Schlüsselwort pausiert die Ausführung der Generator-Funktion und der Wert des Ausdrucks nach dem yield
-Schlüsselwort wird an den Aufrufer des Generators zurückgegeben. Es kann als generatorbasierte Version des return
-Schlüsselworts betrachtet werden.
yield
kann nur direkt innerhalb der Generator-Funktion verwendet werden, die es enthält. Es kann nicht innerhalb geschachtelter Funktionen verwendet werden.
Der Aufruf einer Generator-Funktion erstellt ein Generator
-Objekt. Jedes Mal, wenn die next()
-Methode des Generators aufgerufen wird, wird die Ausführung des Generators fortgesetzt, und läuft bis zu einem der folgenden Punkte:
- Ein
yield
-Ausdruck. In diesem Fall pausiert der Generator, und dienext()
-Methode gibt ein Iterator-Ergebnis-Objekt mit zwei Eigenschaften zurück:value
unddone
. Die Eigenschaftvalue
ist der Wert des Ausdrucks nach demyield
-Operator, unddone
istfalse
, was anzeigt, dass die Generator-Funktion noch nicht vollständig abgeschlossen ist. - Das Ende der Generator-Funktion. In diesem Fall endet die Ausführung des Generators, und die
next()
-Methode gibt ein Iterator-Ergebnis-Objekt zurück, bei demvalue
undefined
ist unddone
true
ist. - Eine
return
-Anweisung. In diesem Fall endet die Ausführung des Generators, und dienext()
-Methode gibt ein Iterator-Ergebnis-Objekt zurück, bei demvalue
der angegebene Rückgabewert ist unddone
true
ist. - Eine
throw
-Anweisung. In diesem Fall wird die Ausführung des Generators vollständig gestoppt, und dienext()
-Methode wirft die angegebene Ausnahme.
Sobald auf einem yield
-Ausdruck pausiert wurde, bleibt die Code-Ausführung des Generators angehalten, bis die next()
-Methode des Generators erneut aufgerufen wird. Wenn ein optionaler Wert an die next()
-Methode des Generators übergeben wird, wird dieser Wert zum zurückgegebenen Wert der aktuellen yield
-Operation des Generators. Der erste next()
-Aufruf hat keine entsprechende angehaltene yield
-Operation, sodass es keine Möglichkeit gibt, das Argument zu erhalten, das an den ersten next()
-Aufruf übergeben wird.
Wenn die return()
- oder throw()
-Methode des Generators aufgerufen wird, wirkt es sich so aus, als ob eine return
- oder throw
-Anweisung an dem angehaltenen yield
-Ausdruck ausgeführt wurde. Sie können try...catch...finally
innerhalb des Rumpfes der Generator-Funktion verwenden, um mit diesen frühen Abschlüssen umzugehen. Wenn die return()
- oder throw()
-Methode aufgerufen wird, aber kein angehaltener yield
-Ausdruck vorhanden ist (weil next()
noch nicht aufgerufen wurde oder weil der Generator bereits abgeschlossen ist), dann können die frühen Abschlüsse nicht behandelt werden und beenden immer den Generator.
Beispiele
Verwendung von yield
Der folgende Code ist die Deklaration einer Beispiel-Generator-Funktion.
function* countAppleSales() {
const saleList = [3, 7, 5];
for (const sale of saleList) {
yield sale;
}
}
Sobald eine Generator-Funktion definiert ist, kann sie durch Konstruktion eines Iterators verwendet werden, wie gezeigt.
const appleStore = countAppleSales(); // Generator { }
console.log(appleStore.next()); // { value: 3, done: false }
console.log(appleStore.next()); // { value: 7, done: false }
console.log(appleStore.next()); // { value: 5, done: false }
console.log(appleStore.next()); // { value: undefined, done: true }
Sie können auch einen Wert mit next(value)
in den Generator senden. step
bewertet sich als Rückgabewert des yield
-Ausdrucks — obwohl der Wert, der der next()
-Methode des Generators beim ersten Aufruf von next()
übergeben wird, ignoriert wird.
function* counter(value) {
while (true) {
const step = yield value++;
if (step) {
value += step;
}
}
}
const generatorFunc = counter(0);
console.log(generatorFunc.next().value); // 0
console.log(generatorFunc.next().value); // 1
console.log(generatorFunc.next().value); // 2
console.log(generatorFunc.next().value); // 3
console.log(generatorFunc.next(10).value); // 14
console.log(generatorFunc.next().value); // 15
console.log(generatorFunc.next(10).value); // 26
Spezifikationen
Specification |
---|
ECMAScript® 2026 Language Specification # prod-YieldExpression |